/**
  ******************************************************************************
  * @文件名           : dri_AnalogQuantity.h
  * @作者             : citunhk
  * @功能介绍         : 模拟量驱动
  *	@日期             : 2022.11.1
  ******************************************************************************
  * @注意
  *
  *
  *
  ******************************************************************************
  *更改记录
  *日期 修改人 修改内容
  *
  *
  *
  ******************************************************************************
  */
#ifndef __DRI_ANALOGQUANTITY_H
#define __DRI_ANALOGQUANTITY_H

#include <stdint.h>
#include "bsp_gpio.h"

#define RC_AD_INC 	 30		//=消抖计数加速反应阀值(含义:如果AD码同向变化量超过30,让计数器+2)
#define RC_CNT_MAX   50		//=消抖计数最大值(此常量影响滤波的灵敏度)(含义:当计数器>本设定值时,RC增加一个步长)
#define RCVALUE_STEP 5     //=滤波系数增量(此常量影响滤波的灵敏度)
//#define RCVALUE_MAX  25	//=滤波系数最大值(此常量影响滤波的灵敏度)

//#define RC_CNT_MAX   10		//=消抖计数最大值(此常量影响滤波的灵敏度)(含义:当计数器>本设定值时,RC增加一个步长)
//#define RCVALUE_STEP 15     //=滤波系数增量(此常量影响滤波的灵敏度)
#define RCVALUE_MAX  100	//=滤波系数最大值(此常量影响滤波的灵敏度)

typedef enum
{
	ONE_AOUT = 1U,
	TWO_AOUT
}outCh_t;

typedef enum
{
	ONE_AINT = 1U,
	TWO_AINT,
	THREE_AINT,
	FOUR_AINT
}inCh_t;

typedef struct tagRCfilter//滤波参数结构
{
	float lastValue;//滤波结果
	float err_max;//差值限值 正数
	uint16_t lastDirection;//数据变化方向标志(0=减少,1=增加)
	uint16_t k;//滤波系数(0~255)
	uint16_t k_init;//滤波系数初始值(越大灵敏度越高，0~255)一般取0
	uint16_t k_max;//滤波系数最大值(越大滞后性越小，0~255)一般取255
	uint16_t k_inc;//滤波系数增量(越大灵敏度越高，一般取10~30)5
	uint16_t cnt;//消抖计数器
	uint16_t cnt_max;//消抖计数器最大值(越大平滑度越高，一般取10)50
}RCF;

typedef union _SensorParam		//传感器校准
{
	uint8_t configBuff[256];//20210513 杨 从512修改为256
	struct
	{
		uint8_t  ProtectedFlag1;
		uint8_t  ProtectedFlag;
		float    Yrpt1[6];
		float    Xrad1[6];

		float    Yrpt2[6];
		float    Xrad2[6];

		float    Yrpt3[6];
		float    Xrad3[6];
		float mValue[3];

		float DisplayValue1[3];
		float DisplayValue2[3];
		float DisplayValue3[3];
	}datas;
}SensorParam;

typedef union _Config
{
	uint8_t configBuff[32];//20210513 杨 从512修改为32
	struct
	{
		uint8_t  ProtectedFlag;
		uint8_t  Language;
		uint8_t  TemperatureUint;
		float fTempTarget;		 //目标温度
		uint8_t cCfgDisplay;				//温度显示精度	0－无小数位    1－1位小数 2－2位小数
		//温度校正 0011
		float fTempPrecision;	 //温度偏差-控制精度
		uint8_t cTempLowPass1;	 //低通滤波时间1
		uint8_t cTempLowPass2;	 //低通滤波时间2
		uint8_t cTempLowPass3;	 //低通滤波时间3
		uint8_t cPumpAutoOff;	 //待机时水泵延时关闭
		//运行模式 0022
		uint8_t cRunMode;		  //控制模式 0－自动启动 1－手动启动 2－远程开关控制 3－远程通讯控制
		uint8_t cKeyLock;         //0:不锁屏 1：锁屏
		uint8_t cRestoreFactory;  //0:不恢复出厂设置 1：恢复出厂设置			//
		uint16_t nDeviceRunTime1;  //设备累计运行时间
		uint16_t nDeviceRunTime2;  //设备累计运行时间
		uint16_t nDeviceRunTime3;  //设备累计运行时间
		uint16_t nDeviceRunTime4;  //设备累计运行时间
	}datas;
}Config;

extern float gFilter_adc[7];  //处理后的AD值
extern float ppt1_K[9];  //PT100-1校准K
extern float ppt1_B[9];  //PT100-1校准B
extern float ppt2_K[9];  //PT100-2校准K
extern float ppt2_B[9];  //PT100-2校准B
extern float ppt3_K[9];  //PT100-3校准K
extern float ppt3_B[9];  //PT100-3校准B
extern float pai1_K[2];  //模拟量输入1校准K
extern float pai1_B[2];  //模拟量输入1校准B
extern float gpres_ele;
extern const uint16_t pu16ptR[10];  //需要校准的电阻点
extern const uint16_t pu16aiI[2];  //需要校准的电流点

void DRI_Save_Restoru(void);
void DRI_KB_Init(void);
void DRI_Temp_Init(void);
uint16_t DRI_MedianFilter(uint16_t pData[], uint8_t size);
float DRI_RcFilter(RCF *pRCF,float fValueInput);
void DRI_Analog_In(void);
void DRI_Analog_Output(outCh_t way,uint16_t dutyCycle);
void DRI_CalculateKB(void);
float DRI_Get_Rpt1(void);
float DRI_Get_Rpt2(void);
float DRI_Get_Rpt3(void);
float DRI_One_CaliValue(void);
float DRI_Two_CaliValue(void);
float DRI_Three_CaliValue(void);
float DRI_Pt100Temperature_Cal(uint16_t pt100_res);
float DRI_ScalingConversion(uint16_t ad, int16_t pvMax, int16_t pvMin, float Cali);
void DRI_GetTempSR(uint8_t  number);
void DRI_Calibration_AD(void);
float DRI_Read_Temp(uint8_t pt100ch);
float DRI_Read_Flow(uint8_t flowch);

#endif
